package com.ryujung.hash.leetCode_202;

import java.util.HashSet;
import java.util.Set;

class Solution {
    /**
     * 思路：
     * 如果只有一位数字,且平方也只有一位数，则结束循环
     * 如果n不止一位数，则将n的每个数字平方相加，得到新的n
     * <p>
     * 非快乐数计算的结果是不断的数字循环
     * 所以要解决非快乐数中的数字循环检测问题
     * 两种方式：快慢指针、set集合判断
     */
    public boolean isHappy1(int n) {
        Set<Integer> set = new HashSet<>();
        while (n / 10 != 0 || n * n / 10 != 0) {
            if (set.contains(n)) {
                return false;
            } else {
                set.add(n);
            }

            int sum = 0;
            while (n > 0) {
                sum += (n % 10) * (n % 10);
                n = n / 10;
            }
            n = sum;
        }
        return n == 1;
    }

    /**
     * 快指针和满指针当前持有的数不同，且下一个数也不同，
     * 所以要建立一个单独的方法，根据当前数获取下一个值
     */
    public boolean isHappy(int n) {
        int slow = n;
        int fast = getNext(n);
        while (fast != 1 && fast != slow) {
            // 快指针直接跳过的一次，所以要在循环条件中判断，避免跳过结果为1 的情况
            fast = getNext(getNext(fast));
            slow = getNext(slow);
        }
        return fast == 1;
    }

    public int getNext(int n) {
        int sum = 0;
        while (n > 0) {
            int i = n % 10;
            n = n / 10;
            sum += i * i;
        }
        return sum;
    }

}